{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.1.0\n",
      "sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)\n",
      "matplotlib 3.1.3\n",
      "numpy 1.18.1\n",
      "pandas 1.0.1\n",
      "sklearn 0.22.1\n",
      "tensorflow 2.1.0\n",
      "tensorflow_core.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "'''\n",
    "自定义损失函数：\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(7, shape=(), dtype=int32)\n"
     ]
    }
   ],
   "source": [
    "## 自定义损失函数\n",
    "## 函数要求是：根据传入的预测值和实际值，获取一个实际的实际的值\n",
    "def customized_mse(y_true, y_pred):\n",
    "    ## reduce_mean会把矩阵中所有的值 全部加到一起，返回一个均值（标量）\n",
    "    return tf.reduce_mean(tf.square(y_pred - y_true))\n",
    "\n",
    "data=customized_mse(\n",
    "    tf.constant([1,2,3,4]),\n",
    "    tf.constant([2,4,6,8])\n",
    ")\n",
    "print(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _california_housing_dataset:\n",
      "\n",
      "California Housing dataset\n",
      "--------------------------\n",
      "\n",
      "**Data Set Characteristics:**\n",
      "\n",
      "    :Number of Instances: 20640\n",
      "\n",
      "    :Number of Attributes: 8 numeric, predictive attributes and the target\n",
      "\n",
      "    :Attribute Information:\n",
      "        - MedInc        median income in block\n",
      "        - HouseAge      median house age in block\n",
      "        - AveRooms      average number of rooms\n",
      "        - AveBedrms     average number of bedrooms\n",
      "        - Population    block population\n",
      "        - AveOccup      average house occupancy\n",
      "        - Latitude      house block latitude\n",
      "        - Longitude     house block longitude\n",
      "\n",
      "    :Missing Attribute Values: None\n",
      "\n",
      "This dataset was obtained from the StatLib repository.\n",
      "http://lib.stat.cmu.edu/datasets/\n",
      "\n",
      "The target variable is the median house value for California districts.\n",
      "\n",
      "This dataset was derived from the 1990 U.S. census, using one row per census\n",
      "block group. A block group is the smallest geographical unit for which the U.S.\n",
      "Census Bureau publishes sample data (a block group typically has a population\n",
      "of 600 to 3,000 people).\n",
      "\n",
      "It can be downloaded/loaded using the\n",
      ":func:`sklearn.datasets.fetch_california_housing` function.\n",
      "\n",
      ".. topic:: References\n",
      "\n",
      "    - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
      "      Statistics and Probability Letters, 33 (1997) 291-297\n",
      "\n",
      "(20640, 8)\n",
      "(20640,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "\n",
    "housing = fetch_california_housing()\n",
    "print(housing.DESCR)\n",
    "print(housing.data.shape)\n",
    "print(housing.target.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(11610, 8) (11610,)\n",
      "(3870, 8) (3870,)\n",
      "(5160, 8) (5160,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
    "    housing.data, housing.target, random_state = 7)\n",
    "x_train, x_valid, y_train, y_valid = train_test_split(\n",
    "    x_train_all, y_train_all, random_state = 11)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_test.shape, y_test.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_valid_scaled = scaler.transform(x_valid)\n",
    "x_test_scaled = scaler.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense (Dense)                (None, 30)                270       \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 31        \n",
      "=================================================================\n",
      "Total params: 301\n",
      "Trainable params: 301\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "## 自定义损失函数\n",
    "## 函数要求是：根据传入的预测值和实际值，获取一个实际的实际的值\n",
    "def customized_mse(y_true, y_pred):\n",
    "    ## reduce_mean会把矩阵中所有的值 全部加到一起，返回一个均值（标量，表示向量，就是标量）\n",
    "    return tf.reduce_mean(tf.square(y_pred - y_true))\n",
    "\n",
    "## 定义模型结构\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation='relu',\n",
    "                       input_shape=x_train.shape[1:]),\n",
    "    keras.layers.Dense(1),\n",
    "])\n",
    "model.summary()\n",
    "## 编译模型，将损失函数定义为自定义的损失函数\n",
    "model.compile(loss=customized_mse, optimizer=\"sgd\",\n",
    "              metrics=[\"mean_squared_error\"])\n",
    "callbacks = [keras.callbacks.EarlyStopping(\n",
    "    patience=5, min_delta=1e-2)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "11610/11610 [==============================] - 1s 100us/sample - loss: 1.8152 - mean_squared_error: 1.8152 - val_loss: 0.9983 - val_mean_squared_error: 0.9983\n",
      "Epoch 2/100\n",
      "11610/11610 [==============================] - 1s 119us/sample - loss: 0.8248 - mean_squared_error: 0.8248 - val_loss: 0.8222 - val_mean_squared_error: 0.8222\n",
      "Epoch 3/100\n",
      "11610/11610 [==============================] - 1s 100us/sample - loss: 0.7277 - mean_squared_error: 0.7277 - val_loss: 0.7677 - val_mean_squared_error: 0.7677\n",
      "Epoch 4/100\n",
      "11610/11610 [==============================] - 1s 95us/sample - loss: 0.6882 - mean_squared_error: 0.6882 - val_loss: 0.7343 - val_mean_squared_error: 0.7343\n",
      "Epoch 5/100\n",
      "11610/11610 [==============================] - 1s 94us/sample - loss: 0.6599 - mean_squared_error: 0.6599 - val_loss: 0.7074 - val_mean_squared_error: 0.7074\n",
      "Epoch 6/100\n",
      "11610/11610 [==============================] - 1s 102us/sample - loss: 0.6365 - mean_squared_error: 0.6365 - val_loss: 0.6827 - val_mean_squared_error: 0.6827\n",
      "Epoch 7/100\n",
      "11610/11610 [==============================] - 1s 91us/sample - loss: 0.6160 - mean_squared_error: 0.6160 - val_loss: 0.6586 - val_mean_squared_error: 0.6586\n",
      "Epoch 8/100\n",
      "11610/11610 [==============================] - 1s 91us/sample - loss: 0.5978 - mean_squared_error: 0.5978 - val_loss: 0.6461 - val_mean_squared_error: 0.6461\n",
      "Epoch 9/100\n",
      "11610/11610 [==============================] - 2s 162us/sample - loss: 0.5814 - mean_squared_error: 0.5814 - val_loss: 0.6236 - val_mean_squared_error: 0.6236\n",
      "Epoch 10/100\n",
      "11610/11610 [==============================] - 1s 117us/sample - loss: 0.5657 - mean_squared_error: 0.5657 - val_loss: 0.6053 - val_mean_squared_error: 0.6053\n",
      "Epoch 11/100\n",
      "11610/11610 [==============================] - 2s 170us/sample - loss: 0.5522 - mean_squared_error: 0.5522 - val_loss: 0.5881 - val_mean_squared_error: 0.5881\n",
      "Epoch 12/100\n",
      "11610/11610 [==============================] - 2s 173us/sample - loss: 0.5393 - mean_squared_error: 0.5393 - val_loss: 0.5751 - val_mean_squared_error: 0.5751\n",
      "Epoch 13/100\n",
      "11610/11610 [==============================] - 2s 151us/sample - loss: 0.5280 - mean_squared_error: 0.5280 - val_loss: 0.5609 - val_mean_squared_error: 0.5609\n",
      "Epoch 14/100\n",
      "11610/11610 [==============================] - 2s 180us/sample - loss: 0.5184 - mean_squared_error: 0.5184 - val_loss: 0.5511 - val_mean_squared_error: 0.5511\n",
      "Epoch 15/100\n",
      "11610/11610 [==============================] - 2s 156us/sample - loss: 0.5098 - mean_squared_error: 0.5098 - val_loss: 0.5418 - val_mean_squared_error: 0.5418\n",
      "Epoch 16/100\n",
      "11610/11610 [==============================] - 2s 189us/sample - loss: 0.5017 - mean_squared_error: 0.5017 - val_loss: 0.5325 - val_mean_squared_error: 0.5325\n",
      "Epoch 17/100\n",
      "11610/11610 [==============================] - 2s 138us/sample - loss: 0.4961 - mean_squared_error: 0.4961 - val_loss: 0.5259 - val_mean_squared_error: 0.5259\n",
      "Epoch 18/100\n",
      "11610/11610 [==============================] - 2s 183us/sample - loss: 0.4903 - mean_squared_error: 0.4903 - val_loss: 0.5195 - val_mean_squared_error: 0.5195\n",
      "Epoch 19/100\n",
      "11610/11610 [==============================] - 2s 137us/sample - loss: 0.4854 - mean_squared_error: 0.4854 - val_loss: 0.5143 - val_mean_squared_error: 0.5143\n",
      "Epoch 20/100\n",
      "11610/11610 [==============================] - 2s 141us/sample - loss: 0.4805 - mean_squared_error: 0.4805 - val_loss: 0.5086 - val_mean_squared_error: 0.5086\n",
      "Epoch 21/100\n",
      "11610/11610 [==============================] - 2s 132us/sample - loss: 0.4767 - mean_squared_error: 0.4767 - val_loss: 0.5041 - val_mean_squared_error: 0.5041\n",
      "Epoch 22/100\n",
      "11610/11610 [==============================] - 2s 142us/sample - loss: 0.4731 - mean_squared_error: 0.4731 - val_loss: 0.5007 - val_mean_squared_error: 0.5007\n",
      "Epoch 23/100\n",
      "11610/11610 [==============================] - 2s 191us/sample - loss: 0.4692 - mean_squared_error: 0.4692 - val_loss: 0.4988 - val_mean_squared_error: 0.4988\n",
      "Epoch 24/100\n",
      "11610/11610 [==============================] - 2s 150us/sample - loss: 0.4659 - mean_squared_error: 0.4659 - val_loss: 0.4920 - val_mean_squared_error: 0.4920\n",
      "Epoch 25/100\n",
      "11610/11610 [==============================] - 2s 145us/sample - loss: 0.4633 - mean_squared_error: 0.4633 - val_loss: 0.4926 - val_mean_squared_error: 0.4926\n",
      "Epoch 26/100\n",
      "11610/11610 [==============================] - 2s 137us/sample - loss: 0.4604 - mean_squared_error: 0.4604 - val_loss: 0.4864 - val_mean_squared_error: 0.4864\n",
      "Epoch 27/100\n",
      "11610/11610 [==============================] - 2s 179us/sample - loss: 0.4579 - mean_squared_error: 0.4579 - val_loss: 0.4837 - val_mean_squared_error: 0.4837\n",
      "Epoch 28/100\n",
      "11610/11610 [==============================] - 2s 195us/sample - loss: 0.4556 - mean_squared_error: 0.4556 - val_loss: 0.4807 - val_mean_squared_error: 0.4807\n",
      "Epoch 29/100\n",
      "11610/11610 [==============================] - 2s 197us/sample - loss: 0.4530 - mean_squared_error: 0.4530 - val_loss: 0.4791 - val_mean_squared_error: 0.4791\n",
      "Epoch 30/100\n",
      "11610/11610 [==============================] - 2s 131us/sample - loss: 0.4507 - mean_squared_error: 0.4507 - val_loss: 0.4768 - val_mean_squared_error: 0.4768\n",
      "Epoch 31/100\n",
      "11610/11610 [==============================] - 2s 141us/sample - loss: 0.4483 - mean_squared_error: 0.4483 - val_loss: 0.4723 - val_mean_squared_error: 0.4723\n",
      "Epoch 32/100\n",
      "11610/11610 [==============================] - 1s 126us/sample - loss: 0.4460 - mean_squared_error: 0.4460 - val_loss: 0.4719 - val_mean_squared_error: 0.4719\n",
      "Epoch 33/100\n",
      "11610/11610 [==============================] - 2s 153us/sample - loss: 0.4439 - mean_squared_error: 0.4439 - val_loss: 0.4672 - val_mean_squared_error: 0.4672\n",
      "Epoch 34/100\n",
      "11610/11610 [==============================] - 2s 140us/sample - loss: 0.4422 - mean_squared_error: 0.4422 - val_loss: 0.4656 - val_mean_squared_error: 0.4656\n",
      "Epoch 35/100\n",
      "11610/11610 [==============================] - 2s 136us/sample - loss: 0.4396 - mean_squared_error: 0.4396 - val_loss: 0.4627 - val_mean_squared_error: 0.4627\n",
      "Epoch 36/100\n",
      "11610/11610 [==============================] - 2s 132us/sample - loss: 0.4378 - mean_squared_error: 0.4378 - val_loss: 0.4611 - val_mean_squared_error: 0.4611\n",
      "Epoch 37/100\n",
      "11610/11610 [==============================] - 1s 121us/sample - loss: 0.4357 - mean_squared_error: 0.4357 - val_loss: 0.4587 - val_mean_squared_error: 0.4587\n",
      "Epoch 38/100\n",
      "11610/11610 [==============================] - 1s 95us/sample - loss: 0.4336 - mean_squared_error: 0.4336 - val_loss: 0.4560 - val_mean_squared_error: 0.4560\n",
      "Epoch 39/100\n",
      "11610/11610 [==============================] - 1s 105us/sample - loss: 0.4317 - mean_squared_error: 0.4317 - val_loss: 0.4549 - val_mean_squared_error: 0.4549\n",
      "Epoch 40/100\n",
      "11610/11610 [==============================] - 2s 146us/sample - loss: 0.4297 - mean_squared_error: 0.4297 - val_loss: 0.4524 - val_mean_squared_error: 0.4524\n",
      "Epoch 41/100\n",
      "11610/11610 [==============================] - 1s 113us/sample - loss: 0.4279 - mean_squared_error: 0.4279 - val_loss: 0.4526 - val_mean_squared_error: 0.4526\n",
      "Epoch 42/100\n",
      "11610/11610 [==============================] - 2s 159us/sample - loss: 0.4260 - mean_squared_error: 0.4260 - val_loss: 0.4484 - val_mean_squared_error: 0.4484\n",
      "Epoch 43/100\n",
      "11610/11610 [==============================] - 1s 122us/sample - loss: 0.4248 - mean_squared_error: 0.4248 - val_loss: 0.4467 - val_mean_squared_error: 0.4467\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train_scaled, y_train,\n",
    "                    validation_data = (x_valid_scaled, y_valid),\n",
    "                    epochs = 100,\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 95us/sample - loss: 0.4375 - mean_squared_error: 0.4375\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.43752956196319226, 0.4375298]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
